// 同时只执行一个脚本
if (engines.all().filter(i => i.getSource() == 'onlinegaodejs').length > 1) {
  exit();
}

var w = floaty.rawWindow(
  <frame gravity="center" bg="#ffffffff">
    <text id="text">开始</text>
  </frame>
);
w.setTouchable(false);
w.setPosition(0, 33);

let idToPhone = {
  '092567c40a': '2652',
  '9759294b5f': '1866',
  '138fd3ac91': '6288',
  '914b08d78a': '7242',
  'de39bb0a57': '1503',
  'e21d619a22': '3516',
  'ad8456d6fa': '2304',
  '95755d5004': '0798', // 前8个
  'a6de1a9d5b': '1008',
  'd5f4bb780e': '0119',
  'fb257fc142': '1086',
  '38e6847bbe': '6576',
  '5ec00842ef': '2576',
  'b5f5ef5ce0': '0627', // 6个
}


/** 0 关机  0-1已开机 0-2 已打开无障碍 
 * 1- 运行任务中 1-0 打开高德   1-1:7000 骑行中  1-2:4000 步行中   
 * 2 任务结束 2-0 任务完成已关机 */
let serverIsOk = true;
var updateStatus = function (info) {
  ui.run(() => { w.text.setText(info) });
  let phone = idToPhone[device.serial];
  if (phone && serverIsOk) {
    try {
      http.__okhttp__.setTimeout(1000);
      var res = http.get('http://18.141.218.112:8001/update/' + phone + '/' + info);
      if (res.statusCode != 200) {
        log('服务器异常')
      }
    } catch (error) {
      log('服务器异常');
      sendToPhone('服务器异常');
      serverIsOk = false;
    }
  }
}


function ifExistClick(clsName, txt, waitSec) {
  if (className(clsName).text(txt).exists()) {
    var b = className(clsName).text(txt).findOne();
    click(b.bounds().centerX(), b.bounds().centerY());
    sleep(waitSec);
  }
}

function waitForAndClick(clsName, txt, waitSec) {
  className(clsName).text(txt).waitFor(); sleep(500);
  if (className(clsName).text(txt).exists()) {
    var b = className(clsName).text(txt).findOne();
    click(b.bounds().centerX(), b.bounds().centerY());
    sleep(waitSec);
  }
}

function gaodeIsRunning() {
  if (currentPackage() == 'com.autonavi.minimap') { return true }
  var intent = new Intent();
  intent.setAction("android.settings.APPLICATION_DEVELOPMENT_SETTINGS"); //
  app.startActivity(intent);
  waitForAndClick('android.widget.TextView', '正在运行的服务', 8000);
  let f = className('android.widget.TextView').text('高德地图').exists();
  recents(); sleep(6000); click(645, 1035); sleep(2000); back(); sleep(3000);
  return f;
}

/** 先进行位置模拟，先停止路线模拟 */
var wzmm = function () {
  stopLxmm();
  if (className("android.widget.TextView").text("历史位置").exists()) {
  } else {
    click(360, 80); sleep(1000); //随便点一下, 再点击抽屉栏按钮
    className("android.widget.ImageButton").desc("Open navigation drawer").findOne().click(); sleep(1500);
    var t = className("android.widget.CheckedTextView").text("位置模拟").findOne();
    click(t.bounds().centerX(), t.bounds().centerY()); sleep(1000);
  }
  while (true) {
    if (className("android.widget.TextView").text("停止模拟").exists()) { sleep(500); return; }
    var t = className("android.widget.TextView").text("启动模拟").findOne();
    click(t.bounds().centerX(), t.bounds().centerY()); sleep(1000);
  }
}

// 跳到路线模拟页面
var toLxmm = function () {
  home(); sleep(1000); click(360,600); //点击fakelocation
  if (className("android.widget.TextView").text("历史路线").exists()) {
  } else {
    click(360, 80); sleep(1000); //随便点一下, 再点击抽屉栏按钮
    className("android.widget.ImageButton").desc("Open navigation drawer").findOne().click(); sleep(1500);
    click(160, 513); sleep(1500);//点击路线模拟
  }
}

function stopLxmm() {
  toLxmm();
  if (className("android.widget.TextView").text("停止模拟").exists()) {
    var t = className("android.widget.TextView").text("停止模拟").findOne();
    click(t.bounds().centerX(), t.bounds().centerY()); sleep(1000);
  }
}

/** 等待网络连接 */
function waitForInternet() {
  while (true) {
    try {
      http.get("www.baidu.com"); sleep(2000); return;
    } catch (err) {
      sleep(60000);
    }
  }
}

//从首页跳到绿色出行
var homeToLscx = function () {
  log("homeToLscx function start");
  text("我的").boundsInside(0, 1033, 720, 1118).findOne(10000);
  // todo 点击后的问题：1 网络问题一直加载不出来  2 直接出报错页面
  let afterClickLoops = 0;
  while (true) {
    if (className("android.widget.Button").textContains("立即升级").exists()
      || className("android.widget.Button").textContains("立即安装").exists()) {
      var b = className("android.widget.ImageView").id("iv_close").findOne();
      click(b.bounds().centerX(), b.bounds().centerY()); sleep(2000);
    }
    if (text("绿色出行-碳普惠 ").boundsInside(20,40,700,134).exists()) {
      break;
    } else if (afterClickLoops > 10) {
      back(); sleep(3000); afterClickLoops = 0;
    }
    if (className("android.view.View").text("官方认证MaaS碳普惠平台").exists()) {
      afterClickLoops = 1;
      waitForAndClick("android.view.View", "官方认证MaaS碳普惠平台", 2000);
    } else if (text("我的").boundsInside(0, 1033, 720, 1118).exists()) {
      var wd = text("首页").boundsInside(0, 1033, 720, 1118).findOne();
      click(wd.bounds().centerX(), wd.bounds().centerY()); sleep(3000);//点击首页
      var wd = text("我的").boundsInside(0, 1033, 720, 1118).findOne();
      click(wd.bounds().centerX(), wd.bounds().centerY()); sleep(2000);//点击我的
    }
    sleep(2000);
    if (afterClickLoops > 0) {
      afterClickLoops = afterClickLoops + 1;
    }
  }
  log("homeToLscx function end");
}

// 转到绿色出行，先跳转到首页，再跳到绿色出行
var goToLscx = function () {
  log('goToLscx function start');
  // 在任务弹窗页面
  while (true) {
    if (className("android.view.View").text("完成步行导航").exists() || className("android.widget.TextView").text("完成步行导航").exists()) {
      click(666, 178); sleep(1000); //关闭弹出的任务列表
    }
    if (text("绿色出行-碳普惠 ").boundsInside(20,40,700,134).exists()) {
      log('goToLscx function end'); return;
    }
    // 在首页了
    if (text("我的").boundsInside(0, 1033, 720, 1118).exists()) { break; }
    if (className("android.view.View").text("步行导航结束").exists() || className("android.view.View").text("骑行导航结束").exists()) {
      log('在步行结束或骑行结束页面，准备返回首页');
      sleep(1500); back(); sleep(1500); //回到首页
    }
  }
  homeToLscx();
  log('goToLscx function end');
}


// 弹出获取能量，弹出任务列表
var popTask = function () {
  log('popTask function start');
  while (true) {
    if (className("android.view.View").text("完成步行导航").exists() || className("android.widget.TextView").text("完成步行导航").exists()) {
      break;
    }
    log('invoke goToLscx start'); goToLscx(); log('invoke goToLscx end');
    if (className("android.view.View").textContains("充值卡兑换资格").exists()) {
      getCoupons();
    }
    if (text("绿色出行-碳普惠 ").boundsInside(20,40,700,134).exists()) {
      log("弹出任务列表");
      swipe(360, 100, 360, 1000, 2000); sleep(1000);// ↓滑，页面到顶部
      click(650, 1050); sleep(1000);//点击获取能量,弹出任务列表
      className("android.view.View").text("完成步行导航").waitFor; sleep(1000);
    }
  }
  log('popTask function end');
}

function stopDaoHang() {
  log('stopDaoHang function start'); sleep(1000);
  while (true) {
    if (className("android.widget.TextView").text("首页").boundsInside(43, 1055, 101, 1096).exists()) {
      log('stopDaoHang 查到“首页”'); sleep(1000); break;
    }
    if (text("绿色出行-碳普惠 ").boundsInside(20,40,700,134).exists()) {
      log('stopDaoHang 查到“绿色出行-碳普惠”'); sleep(1000); break;
    }
    if (className("android.view.View").text("骑行导航结束").exists() || className("android.view.View").text("步行导航结束").exists() || className("android.view.View").text("自行车导航").exists() || className("android.view.View").text("开始步行导航").exists()) {
      back(); sleep(5000);
    }
    ifExistClick("android.view.View", "退出导航", 2000); //点击退出导航
    ifExistClick("android.view.View", "退出", 1000); //点击退出
    sleep(1000);
  }
  log('stopDaoHang function end');
}


var waitWalkFinish = function () {
  log('waitWalkFinish function start'); sleep(5000); //30s
  if (className("android.view.View").text("退出").boundsInside(20, 1070, 82, 1117).exists()) {
    // 结束导航
    var checkTime = 1; var lastRefresh = 0;; // 1分钟
    for (var i = 0; i < (300 / checkTime); i++) {
      if (className("android.view.View").text("步行导航结束").exists()) {
        sleep(1500); back(); sleep(1500); return; //回到首页
      }
      var t = className("android.view.View").boundsInside(30, 253, 108, 304).depth(17).drawingOrder(1).indexInParent(0).findOnce();
      if (t == null) { return };
      var temp = parseInt(parseInt(t.text() / 1000) / 3); // 0-2999:temp=0, 3000以上:temp=1
      if (i - lastRefresh >= ((temp - 1) * (-15) + temp * 2)) {
        click(650, 920); sleep(2500); click(650, 920); lastRefresh = i;
        t = className("android.view.View").boundsInside(30, 253, 108, 304).depth(17).drawingOrder(1).indexInParent(0).findOnce();
      }
      var nengliang = t.text();
      updateStatus('1-2:' + nengliang);
      if (nengliang > 4000) {
        try { http.get("www.baidu.com") } catch (err) {
          stopLxmm(); waitForInternet(); launch("com.autonavi.minimap");
        }
        stopDaoHang(); break;
      }
      sleep(checkTime * 60000); // 1分钟
    }
  }
  log('waitWalkFinish function end');
}


var waitRideFinish = function () {
  sleep(2000);
  // ui.run(() => { w.text.setText("检查是否正在骑行导航") }); sleep(3000);
  // 已骑行(m) 72,1079,132,1107 已骑行(km) 60,1079,120,1107
  if (className("android.view.View").text("已骑行").boundsInside(16, 1070, 228, 1118).exists()) {
    // 结束导航
    var checkTime = 1; // 1分钟
    var lastRefresh = 0;
    for (var i = 0; i < (200 / checkTime); i++) {
      if (className("android.view.View").text("骑行导航结束").exists()) {
        sleep(1500); back(); sleep(1500); return; //回到首页
      }
      var t = className("android.view.View").boundsInside(30, 394, 108, 445).depth(15).drawingOrder(1).indexInParent(0).findOnce();
      if (t == null) { return };
      var temp = parseInt(parseInt(t.text() / 1000) / 6); // 0-5999:temp=0, 6000以上:temp=1
      if (i - lastRefresh >= ((temp - 1) * (-10) + temp * 1)) {
        click(650, 810); sleep(2500); click(650, 810); lastRefresh = i;//点击全览，刷新页面
        t = className("android.view.View").boundsInside(30, 394, 108, 445).depth(15).drawingOrder(1).indexInParent(0).findOnce();
      }
      updateStatus('1-1:' + t.text());
      if (t.text() > 7000) {
        try { http.get("www.baidu.com") } catch (err) { stopLxmm(); waitForInternet(); launch("com.autonavi.minimap") };
        stopDaoHang(); updateStatus('1-1:7000');
        break;
      }
      sleep(checkTime * 60000); // 1分钟
    }
  }
}


var fakeLocationWalk = function () {
  toLxmm();
  // 上滑到头，最后一个参数是持续时间两秒
  swipe(360, 793, 360, 333, 2000);  sleep(1000);
  if (className("android.widget.TextView").text("停止模拟").exists()) {
    var t = className("android.widget.TextView").text("停止模拟").findOne();
    click(t.bounds().centerX(), t.bounds().centerY());
  }
  sleep(1500);

  click(360, 866); sleep(1000); //点击步行路线
  // 速/频 426,431,483,464    486,424,534,472 (510,448)
  var t = className("android.widget.TextView").text("速/频").findOne();
  click(t.bounds().left + 84, t.bounds().top + 17); sleep(1000);//点击速度
  click(429, t.bounds().top + 145); sleep(1000); //选定步行速度(429,574)
  back(); sleep(1000); //退出速度选择框
  var t = className("android.widget.TextView").text("启动模拟").findOne();
  click(t.bounds().centerX(), t.bounds().centerY()); sleep(1000); //点击开始导航
}


var fakeLocationRide = function () {
  toLxmm();
  // 上滑到头，最后一个参数是持续时间两秒
  swipe(360, 793, 360, 333, 2000); sleep(2000);
  if (className("android.widget.TextView").text("停止模拟").exists()) {
    var t = className("android.widget.TextView").text("停止模拟").findOne();
    click(t.bounds().centerX(), t.bounds().centerY()); sleep(1000);
  }
  click(360, 644); sleep(1000);//点击骑行路线

  // 速/频 426,431,483,464    486,424,534,472 (510,448)
  var t = className("android.widget.TextView").text("速/频").findOne();
  click(t.bounds().left + 84, t.bounds().top + 17); sleep(1000);//点击速度
  click(516, t.bounds().top + 146); sleep(1000);//选定骑行速度(516,574)
  back(); sleep(1000);//退出速度选择框
  var t = className("android.widget.TextView").text("启动模拟").findOne();
  click(t.bounds().centerX(), t.bounds().centerY()); sleep(1000);//点击开始导航
}

/** 判断是否存在去完成按钮，不应该用 boundsInside, 因为inside的区域里可能有其他的 */
function existQwc(left, top) {
  // 156,758  527,771,674(676),827(829)        
  // 156,625  527,639,674(676),695(697)    
  // 156,493  527,506,676,564
  return className("android.widget.TextView").bounds(left + 371, top + 14, left + 520, top + 71).exists() || className("android.widget.TextView").bounds(left + 371, top + 14, left + 520, top + 72).exists() || className("android.widget.TextView").bounds(left + 371, top + 13, left + 520, top + 71).exists() || className("android.widget.TextView").bounds(left + 371, top + 13, left + 520, top + 72).exists() || className("android.widget.TextView").bounds(left + 371, top + 13, left + 520, top + 69).exists();
}

var walk = function (t) {
  fakeLocationWalk(); //模拟步行
  launch("com.autonavi.minimap");  waitForPackage("com.autonavi.minimap", 1000); //打开高德
  popTask(); //点击获取能量，弹出任务列表
  click(t.bounds().left + 444, t.bounds().top + 42); sleep(5000);//点击"去完成"
  id("route_edit_end_text").waitFor()
  while(true){
    if (className("android.view.View").text("退出").boundsInside(20, 1070, 82, 1117).exists()){
      break;
    }
    if(className("android.view.View").text("开始步行导航").exists()){
      waitForAndClick("android.view.View", "开始步行导航", 10000);
    }
    if(className("android.view.View").text("我的位置 ➞ 古城(地铁站)").exists()){
      var t = className("android.view.View").text("我的位置 ➞ 古城(地铁站)").findOne();
      click(t.bounds().centerX(), t.bounds().centerY());  //从历史记录里找到
    }
    sleep(3000);
  }
  updateStatus('1-2:0');
  waitWalkFinish();
}


// 骑行任务
var ride = function (t) {
  sleep(2000);
  fakeLocationRide();
  launch("com.autonavi.minimap");  //打开高德
  waitForPackage("com.autonavi.minimap", 500); //
  popTask(); sleep(500);//点击获取能量，弹出任务列表
  click(t.bounds().left + 444, t.bounds().top + 42); //点击"去完成"
  id("route_edit_end_text").waitFor();
  className("android.view.View").textContains("我的位置 ➞ ").waitFor();
  var t = className("android.view.View").text("我的位置 ➞ 管庄(地铁站)").findOne();
  click(t.bounds().centerX(), t.bounds().centerY()); //从历史记录里找到
  sleep(1500);
  waitForAndClick("android.view.View", "自行车导航", 10000); //点击开始骑行导航
  updateStatus('1-1:0');
  waitRideFinish();
}


/**3-签到任务*/
var sign = function () {
  sleep(500);
  // 签到任务bounds 156,360  去领取bounds  527,374,674,430
  var btn = className("android.view.View").id("taskSignBtn").exists();
  if (btn) {
    updateStatus('1-3:0');
    var t = className("android.view.View").text("签到任务").findOne();
    // click(qdrw.bounds().left + 444, qdrw.bounds().top + 42); //点击"去完成"
    click(t.bounds().left + 444, t.bounds().top + 42);
    sleep(5000); // 签到任务不用返回
    updateStatus('1-3:500');
  }
}


/** 4-实时公交 */
var realTimeBus = function (t) {
  log("实时公交任务 点击去完成");
  click(t.bounds().left + 444, t.bounds().top + 42); //点击"去完成"
  sleep(5000);  back();  sleep(5000);
  if (className('android.widget.TextView').text('添加桌面快捷方式').exists()){
    back();
  }
}

/** 5-下车提醒 */
var xiaCheTiXing = function (t) {
  click(t.bounds().left + 444, t.bounds().top + 42); //点击"去完成"
  sleep(8000);
  if (className("android.view.View").textContains("我的位置 ➞ 北京").exists()) {
    var b = className("android.view.View").textContains("我的位置 ➞ 北京").findOne();
    click(b.bounds().centerX(), b.bounds().centerY()); sleep(1000);
    className("android.view.View").textContains("上车").waitFor(); sleep(1000);
    click(360, 560); sleep(1000);
    className("android.view.View").text("下车提醒").waitFor(); sleep(1000);
    click(589, 600); sleep(5000);
    back(); sleep(3000);
    if (className("android.widget.TextView").text("离开当前页面后无法进行下车提醒").exists()) {
      var b = className("android.widget.Button").text("确认").findOne();
      click(b.bounds().centerX(), b.bounds().centerY()); sleep(2000);
    }
    back(); sleep(2000);
  }
}


function sendToPhone(duihuanma) {
  var url = "https://api.day.app/cCYyxE53Yy6eZStWP76vRR/" + duihuanma + "?sound=tiptoes";
  r = http.get(url);
  if (r.statusCode != 200) {
    log("发送失败" + duihuanma);
    // todo 写到文件里
  }
  log("发送成功" + duihuanma);
}

/** 7-获取兑换码 */
function getCoupons() {
  // todo 判断日期和能量值
  sleep(1000);
  if (className("android.view.View").textContains("充值卡兑换资格").exists()) {
    updateStatus('1-7:0');
    sleep(1000); click(360, 960); //点击兑换
    waitForAndClick("android.view.View", "确认兑换", 2000);
    className("android.view.View").text("兑换成功").waitFor();
    waitForAndClick("android.view.View", "立即查看", 2000);
    swipe(360, 100, 360, 1000, 2000);
    if (className("android.view.View").textContains("卡密").boundsInside(160, 330, 450, 380).exists()) {
      var b = className("android.view.View").textContains("卡密").boundsInside(160, 330, 450, 380).findOne();
      sendToPhone(b.text().replace("卡密 ", ""));
      // todo 判断是否被拉黑
      back(); sleep(2000); back(); sleep(5000);
      // todo
      if (className("android.view.View").textContains("开启下一轮地图").boundsInside(170, 750, 560, 870).exists()) {
        click(360, 810); sleep(10000);
      }
    }
  }
}

/** 跳过我知道了 */
function wzdl() {
  if (className("android.view.View").text("我知道了").exists()) {
    click(360, 785); sleep(1000);
  }
}

/** 6-收集能量 */
function clllectNengliang() {
  var b = className("android.view.View").textContains("当前正在解锁地图").findOne();
  updateStatus('1-6:0');
  var tianshu = b.text().replace("当前正在解锁地图已累计访问：", "").replace("天", "");
  var jieduan = textContains("绿色").boundsInside(260, 977, 375, 1033).findOne().text();
  if (tianshu == '7') {
    click(108, 415); sleep(3000); getCoupons(); wzdl();
    click(108, 415); sleep(3000); wzdl();
    click(274, 345); sleep(3000); wzdl();
    click(441, 415); sleep(3000); wzdl();
    click(609, 345);
  }
}


auto.waitFor(); sleep(1000); updateStatus('0-2'); // 虚拟机启动失败，进行重启
// if (!gaodeIsRunning()) { wzmm() }
home(); sleep(1000); launch("com.autonavi.minimap"); //打开高德
waitForPackage("com.autonavi.minimap", 20000); //
if (className("android.view.View").text("已骑行").boundsInside(16, 1070, 228, 1118).exists()) {
  waitRideFinish();
} else if (className("android.view.View").text("退出").boundsInside(20, 1070, 82, 1117).exists()) {
  waitWalkFinish();
}

while (true) {
  popTask();
  var t = text("完成骑行导航").findOne();
  if (t != null && existQwc(t.bounds().left, t.bounds().top)) {
    log('骑行任务未完成，去完成'); ride(t); continue;
  }
  var t = text("完成步行导航").findOne();
  if (t != null && existQwc(t.bounds().left, t.bounds().top)) {
    log('步行任务未完成，去完成'); walk(t); continue;
  }
  if (text("签到任务").exists() && className("android.view.View").id("taskSignBtn").exists()) {
    sign(); continue;
  }
  if (text("查看实时公交").exists()) {
    var t = text("查看实时公交").findOne(); sleep(500);
    if (existQwc(t.bounds().left, t.bounds().top)) {
      realTimeBus(t); continue;
    }
  } else {
    log('实时公交任务已完成');
  }
  if (text("使用公交“下车提醒”").exists()) {
    var t = text("使用公交“下车提醒”").findOne(); sleep(500);
    if (existQwc(t.bounds().left, t.bounds().top)) {
      xiaCheTiXing(t); continue;
    }
  } else {
    log('下车提醒任务已完成');
  }
  if (text("完成步行导航").exists()) {
    click(666, 178); sleep(1000); //关闭弹出的任务列表
  }
  break;
}

getCoupons();
clllectNengliang();
updateStatus('2');
